package com.atguigu.cloud.controller;

import com.atguigu.cloud.common.Result;
import com.atguigu.cloud.entity.LovConfig;
import com.atguigu.cloud.service.LovConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * Lov配置控制器
 * 
 * @author atguigu
 * @since 2024-01-01
 */
@RestController
@RequestMapping("/lov")
public class LovConfigController {

    @Autowired
    private LovConfigService lovConfigService;

    /**
     * 获取所有Lov配置
     */
    @GetMapping("/configs")
    public Result<List<LovConfig>> getAllConfigs() {
        List<LovConfig> configs = lovConfigService.list();
        return Result.success(configs);
    }

    /**
     * 根据ID获取Lov配置（带列配置）
     */
    @GetMapping("/config/{id}")
    public Result<LovConfig> getConfigById(@PathVariable Long id) {
        LovConfig config = lovConfigService.selectById(id);
        if (config != null) {
            return Result.success(config);
        } else {
            return Result.error("配置不存在");
        }
    }

    /**
     * 根据Lov编码获取配置（带列配置）
     */
    @GetMapping("/config/code/{lovCode}")
    public Result<LovConfig> getConfigByCode(@PathVariable String lovCode) {
        LovConfig config = lovConfigService.selectByLovCode(lovCode);
        if (config != null) {
            return Result.success(config);
        } else {
            return Result.error("配置不存在或已禁用");
        }
    }

    /**
     * 根据Lov编码获取数据列表（分页）
     */
    @GetMapping("/query/{lovCode}")
    public Result<Map<String, Object>> queryLovData(
            @PathVariable String lovCode,
            @RequestParam(required = false) Map<String, Object> params,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(required = false) Integer pageSize) {
        try {
            Map<String, Object> result = lovConfigService.getLovDataWithPage(lovCode, params, pageNum, pageSize);
            return Result.success(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error(e.getMessage());
        }
    }

    /**
     * 根据Lov编码获取数据列表（不分页）
     */
    @GetMapping("/data/{lovCode}")
    public Result<List<Map<String, Object>>> getLovData(
            @PathVariable String lovCode,
            @RequestParam(required = false) String keyword) {
        try {
            List<Map<String, Object>> data = lovConfigService.getLovData(lovCode, keyword);
            return Result.success(data);
        } catch (Exception e) {
            return Result.error(e.getMessage());
        }
    }

    /**
     * 根据Lov编码和值获取显示文本
     */
    @GetMapping("/display/{lovCode}/{value}")
    public Result<String> getDisplayText(@PathVariable String lovCode, @PathVariable String value) {
        try {
            String displayText = lovConfigService.getDisplayText(lovCode, value);
            return Result.success(displayText);
        } catch (Exception e) {
            return Result.error(e.getMessage());
        }
    }

    /**
     * 创建Lov配置（包含列配置）
     */
    @PostMapping("/config")
    public Result<LovConfig> createConfig(@RequestBody LovConfig config) {
        try {
            boolean success = lovConfigService.saveLovConfigWithColumns(config);
            if (success) {
                return Result.success("创建成功", config);
            } else {
                return Result.error("创建失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("创建失败: " + e.getMessage());
        }
    }

    /**
     * 更新Lov配置（包含列配置）
     */
    @PutMapping("/config")
    public Result<LovConfig> updateConfig(@RequestBody LovConfig config) {
        try {
            boolean success = lovConfigService.updateLovConfigWithColumns(config);
            if (success) {
                return Result.success("更新成功", config);
            } else {
                return Result.error("更新失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("更新失败: " + e.getMessage());
        }
    }

    /**
     * 删除Lov配置
     */
    @DeleteMapping("/config/{id}")
    public Result<String> deleteConfig(@PathVariable Long id) {
        boolean success = lovConfigService.removeById(id);
        if (success) {
            return Result.success("删除成功");
        } else {
            return Result.error("删除失败");
        }
    }

    /**
     * 使用自定义参数查询LOV数据（支持MyBatis动态SQL）
     * 
     * @param lovCode      LOV编码
     * @param customParams 自定义参数（支持#{xxx}占位符和<if>等动态SQL标签）
     * @param pageNum      页码
     * @param pageSize     每页大小
     * @return 查询结果
     */
    @PostMapping("/query/{lovCode}/custom")
    public Result<Map<String, Object>> queryWithCustomParams(
            @PathVariable String lovCode,
            @RequestBody(required = false) Map<String, Object> customParams,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(required = false) Integer pageSize) {
        try {
            Map<String, Object> result = lovConfigService.queryWithCustomParams(
                    lovCode, customParams, pageNum, pageSize);
            return Result.success(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("查询失败: " + e.getMessage());
        }
    }
}
